- Created on 2014-10
教材:《汇编语言》(第二版)王爽 著 清华大学出版社
拓展阅读——大小端问题:
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
联合体union的存放顺序是所有成员都从低地址开始存放。
8086CPU的寄存器:
数据寄存器分为:DH&DL=DX(data):数据寄存器,常用于数据传递。
指针寄存器和变址寄存器,包括:
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针
DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
指令指针IP
指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,
IP就自动加(取出该字节的长度,如:BIU从内存中取出的是1个字节,IP就会自动加1,如果BIU从内存中取出的字节数长度为3,IP就自动加3),指向下一个指令字节。
注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。
标志寄存器
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 具体规定如下:(2)当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。(2)如果TF=0,则处于连续工作模式。当运算结果产生溢出时,运算结果不等于逻辑结果,此时的SF值所表示的正负情况与逻辑结果相反,即:SF=0时,逻辑结果为负,SF=1时,逻辑结果为非负。AF:( Assistant Carry Flag)下列情况下,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时(2)、在字节操作时,发生低4位向高4位进位或借位时。PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
段寄存器
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
ES(Extra Segment):附加段寄存器。
章三、寄存器(内存访问)
字单元word:即存放一个字型数据(在8086CPU中为16位,根据CPU的位数决定)的内存单元,
由位数/8个地址连续的内存单元组成。
起始地址位N的字单元简称为:N地址单元。
3.2 DS和[address]
DS是数据段寄存器,8086CPU不支持将数据直接送入段寄存器的操作,
所以只好通过一个寄存器中转,以写入。
[address],即是与CS:IP类似,DS存的是段地址,address指的是地址的偏移值。
用该方式获取的是从该地址起始的字型数据(非字节数据)。
3.7 CPU提供的栈机制
8086CPU的push和pop操作都是以字为单位进行的。
段寄存器
任意时刻,SS:SP指向栈顶元素。
8086CPU对栈上溢和下溢没有防范,需要编程者自己小心编码。
问题3.7-3.10等的是拿来练手,熟悉汇编的。
现做一下3.9——交换ax和bx中的值:


每当SS段寄存器被修改时,下一条指令也会紧跟着被执行!
Show Comments